package com.clouduserservice8001.service;

import com.clouduserservice8001.entity.Employee;
import com.clouduserservice8001.dto.EmployeeVO;

import java.util.List;

/**
 * 员工服务接口
 */
public interface EmployeeService {
    
    /**
     * 创建员工
     * @param employee 员工信息
     * @param createBy 创建人
     * @return 是否成功
     */
    boolean createEmployee(Employee employee, String createBy);
    
    /**
     * 更新员工信息
     * @param employee 员工信息
     * @param updateBy 更新人
     * @return 是否成功
     */
    boolean updateEmployee(Employee employee, String updateBy);
    
    /**
     * 删除员工（逻辑删除，设置状态为离职）
     * @param userId 用户ID
     * @param updateBy 更新人
     * @return 是否成功
     */
    boolean deleteEmployee(String userId, String updateBy);
    
    /**
     * 更新员工状态
     * @param userId 用户ID
     * @param status 状态（1在职，0离职）
     * @param updateBy 更新人
     * @return 是否成功
     */
    boolean updateEmployeeStatus(String userId, String status, String updateBy);
    
    /**
     * 根据用户ID查询员工
     * @param userId 用户ID
     * @return 员工信息
     */
    Employee getEmployeeByUserId(String userId);
    
    /**
     * 根据员工工号查询员工
     * @param employeeNo 员工工号
     * @return 员工信息
     */
    Employee getEmployeeByEmployeeNo(String employeeNo);
    
    /**
     * 根据部门查询员工列表
     * @param deptName 部门名称
     * @return 员工列表
     */
    List<Employee> getEmployeesByDept(String deptName);
    
    /**
     * 查询所有员工列表
     * @return 员工列表
     */
    List<Employee> getAllEmployees();
    
    /**
     * 分页查询员工列表
     * @param deptName 部门名称（可选）
     * @param status 状态（可选）
     * @param keyword 关键字（可选）
     * @return 员工列表
     */
    List<Employee> getEmployeeList(String deptName, String status, String keyword);
    
    /**
     * 根据上级ID查询下属员工列表
     * @param managerId 上级用户ID
     * @return 员工列表
     */
    List<Employee> getEmployeesByManager(String managerId);
    
    /**
     * 检查员工工号是否存在
     * @param employeeNo 员工工号
     * @return 是否存在
     */
    boolean isEmployeeNoExists(String employeeNo);
    
    /**
     * 生成员工工号
     * @return 员工工号
     */
    String generateEmployeeNo();

    // ===== 以下是EmployeeVO相关方法，用于前端显示 =====

    /**
     * 根据用户ID查询员工详细信息（包含用户基本信息）
     * @param userId 用户ID
     * @return 员工详细信息
     */
    EmployeeVO getEmployeeVOByUserId(String userId);

    /**
     * 根据员工工号查询员工详细信息（包含用户基本信息）
     * @param employeeNo 员工工号
     * @return 员工详细信息
     */
    EmployeeVO getEmployeeVOByEmployeeNo(String employeeNo);

    /**
     * 查询员工详细信息列表（包含用户基本信息）
     * @param deptName 部门名称（可选）
     * @param status 状态（可选）
     * @param keyword 关键字（可选）
     * @return 员工详细信息列表
     */
    List<EmployeeVO> getEmployeeVOList(String deptName, String status, String keyword);

    /**
     * 根据部门查询员工详细信息列表（包含用户基本信息）
     * @param deptName 部门名称
     * @return 员工详细信息列表
     */
    List<EmployeeVO> getEmployeeVOsByDept(String deptName);

    /**
     * 根据上级ID查询下属员工详细信息列表（包含用户基本信息）
     * @param managerId 上级用户ID
     * @return 员工详细信息列表
     */
    List<EmployeeVO> getEmployeeVOsByManager(String managerId);
}
